package com.gph.saviorframework.wf.service;

import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * Created by root on 16-7-2.
 */
public interface ActivitiTaskService {

    /**
     * 根据流程实例编号获取当前执行任务
     * @param processInsId
     * @return
     */
    Task getCurrentTaskInfo(String processInsId);
    
    /**
     * 根据流程实例编号获取当前执行任务的列表
     * @param processInsId
     * @return
     */
    List<Task> getCurrentTasks(String processInsId);

    /**
     * 根据流程实例获取当前执行任务
     * @param processInstance
     * @return
     */
    Task getCurrentTaskInfo(ProcessInstance processInstance);

    /**
     * 根据编号获取任务
     * @param taskId
     * @return
     */
    Task getTaskById(String taskId);

    /**
     * 获取历史任务实例
     * @param processInstanceId
     * @param taskId
     * @return
     */
    HistoricTaskInstance findHistoricTaskInstance(String processInstanceId,String taskId);

    /**
     * 获取已经审批的任务
     * @param processDefinitionKey
     * @param userId
     * @return
     */
    long countApprovedTasks(String processDefinitionKey, String userId);

    /**
     * 获取已经审批的任务
     * @param processDefinitionKey
     * @param userId
     * @return
     */
    long countApprovedTasks(String processDefinitionKey, String businessKey,String userId);

    /**
     * 获取已经完成的任务
     * @param processDefinitionKey
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<HistoricTaskInstance> findApprovedTasks(String processDefinitionKey,
                                                 String userId, Integer start, Integer limit, String sort, String dir);

    /**
     * 查询已经完成的任务列表
     * @param processDefinitionKey
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    Map<String,Object> findApprovedTasksMap(String processDefinitionKey,String userId,Integer start, Integer limit, String sort, String dir);

    /**
     * 获取某个流程实例已经完成的任务
     * @param processInstanceId
     * @return
     */
    List<HistoricTaskInstance> findAllFinishedTasks(String processInstanceId);

    /**
     * 完成任务
     * @param taskId
     * @param userId
     * @param variables
     * @return
     */
    boolean completeUserTask(String taskId, String userId, Map<String, Object> variables);

    /**
     * 完成任务
     * @param taskId
     * @param userId
     * @return
     */
    boolean completeUserTask(String taskId, String userId);

    /**
     * 接受任务
     * @param taskId
     * @param userName
     * @return
     */
    boolean claimTask(String taskId, String userName);

    /**
     * 查找未完成的任务
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<Task> findUnapprovedTasks(String userId, Integer start, Integer limit, String sort, String dir);

    List<Task> findUnapprovedTasks(String processDefKey, String userId, Integer start, Integer limit, String sort, String dir);

    /**
     * 查找未完成的任务
     * @param processDefinitionKey
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    Map<String,Object> findUnapprovedTasksMap(String processDefinitionKey,String userId,Integer start, Integer limit, String sort, String dir);

    /**
     * 计算某用户未完成的任务数量
     * @param userId
     * @return
     */
    long countUnapprovedTasks(String userId);

    /**
     * 计算某用户未完成的任务数量
     * @param userId
     * @return
     */
    long countUnapprovedTasks(String processDefinitionKey, String userId);

    /**
     * 根据流程实例编号获取最后一个执行任务
     * @param processInsId
     * @return
     */
    HistoricTaskInstance getLastTask(String processInsId);

    /*以下接口是有关任务委派的接口*/

    /**
     * 任务委派
     * @param taskId 任务编号
     * @param delegateUser 被委派人
     */
    void delegateTask(String taskId,String delegateUser);

    /**
     * 完成被委派的任务
     * @param taskId
     */
    void resolveTask(String taskId);

    /**
     * 完成被委派的任务
     * @param taskId
     * @param vars
     */
    void resolveTask(String taskId,Map<String,Object> vars);

    /**
     * 根据userid获取被委派且未被处理的任务
     * @param delegateUser
     * @return
     */
    List<Task> getDelegateTasksByUserId(String delegateUser);

    /**
     * 发送消息事件
     * @param taskId
     * @param message
     */
    void sendMessage(String taskId,String message);

    /**
     * 自由流跳转
     *
     * @param targetTaskDefinitionKey 目标任务节点的流程定义key
     */
    void jump(String processInsId,String targetTaskDefinitionKey);


    //获取业务key的相关函数
    /**
     * 获取业务key集合
     * @param processDefinitionKey
     * @param userId
     * @param dir
     * @return
     */
    List<String> getBusinessKeys(String processDefinitionKey, String userId, String dir);

    Map<String,Object> getBusinessKeysMap(String processDefinitionKey, String userId, int start,int limit,String dir);

    /**
     * 计算已经完成任务的业务key
     * @param processDefinitionKey
     * @param userId
     * @return
     */
    long countBusinessKeys(String processDefinitionKey, String userId);

    /**
     * 手机端获取首界面最新待办数量
     * @param username
     * @return
     */
    List<Map<String,String>> appGetTaskCount(String username);

    /**
     * 任务跳转
     * @param processInsId
     * @param destTaskDefId
     */
    void jump2(String processInsId,String destTaskDefId);
}
